Операции присваивания
Простое присваивание
Оператор присваивания = помещает значение в переменную.
int age = 25; // Инициализация при объявлении
age = 30; // Изменение существующей переменной
age = age + 5; // Использование текущего значения
Базовый синтаксис
#include <stdio.h>
int main() {
int score; // Объявление
score = 100; // Присваивание значения
printf("Счет: %d\n", score);
score = 85; // Новое значение
printf("Новый счет: %d\n", score);
return 0;
}
Составные операторы присваивания
Сокращенные формы для модификации переменных.
| Оператор | Эквивалент | Описание | Пример |
|---|---|---|---|
+= | a = a + b | Прибавить и присвоить | x += 5 |
-= | a = a - b | Вычесть и присвоить | x -= 3 |
*= | a = a * b | Умножить и присвоить | x *= 2 |
/= | a = a / b | Разделить и присвоить | x /= 4 |
%= | a = a % b | Остаток и присвоить | x %= 7 |
Арифметические составные операции
- Числовые операции
- Операция остатка
#include <stdio.h>
int main() {
int balance = 1000;
printf("Начальный баланс: %d\n", balance);
balance += 500; // Пополнение счета
printf("После пополнения: %d\n", balance);
balance -= 200; // Покупка
printf("После покупки: %d\n", balance);
balance *= 2; // Удваиваем бонусом
printf("После бонуса: %d\n", balance);
balance /= 4; // Берем четверть
printf("Финальный баланс: %d\n", balance);
return 0;
}
int minutes = 150;
printf("Всего минут: %d\n", minutes);
int hours = minutes / 60; // Полные часы
minutes %= 60; // Остаток минут
printf("Это %d часов и %d минут\n", hours, minutes);
// 150 минут = 2 часа и 30 минут
Поразрядные составные операции
Комбинируют поразрядные операции с присваиванием.
| Оператор | Эквивалент | Описание |
|---|---|---|
&= | a = a & b | Поразрядное И и присвоить |
|= | a = a | b | Поразрядное ИЛИ и присвоить |
^= | a = a ^ b | Исключающее ИЛИ и присвоить |
<<= | a = a << b | Сдвиг влево и присвоить |
>>= | a = a >> b | Сдвиг вправо и присвоить |
Примеры поразрядного присваивания
#include <stdio.h>
int main() {
int flags = 5; // 101 в двоичном виде
printf("Исходные флаги: %d\n", flags);
flags |= 2; // Устанавливаем второй бит: 101 | 010 = 111
printf("После flags |= 2: %d\n", flags);
flags &= 6; // Маскируем: 111 & 110 = 110
printf("После flags &= 6: %d\n", flags);
flags ^= 4; // Переключаем третий бит: 110 ^ 100 = 010
printf("После flags ^= 4: %d\n", flags);
return 0;
}
Операторы сдвига с присваиванием
- Сдвиг влево (<<=)
- Сдвиг вправо (>>=)
int number = 3; // 011
printf("Исходное число: %d\n", number);
number <<= 1; // 110 = 6
printf("После <<= 1: %d\n", number);
number <<= 2; // 11000 = 24
printf("После <<= 2: %d\n", number);
int number = 48; // 110000
printf("Исходное число: %d\n", number);
number >>= 1; // 11000 = 24
printf("После >>= 1: %d\n", number);
number >>= 2; // 110 = 6
printf("После >>= 2: %d\n", number);
Множественное присваивание
int a, b, c;
// Присваивание одного значения нескольким переменным
a = b = c = 10;
printf("a = %d, b = %d, c = %d\n", a, b, c); // 10, 10, 10
// Цепочка вычислений
int x = 5;
int y = (x += 3) * 2; // x становится 8, y становится 16
printf("x = %d, y = %d\n", x, y);
Возвращаемое значение присваивания
Операция присваивания возвращает присвоенное значение:
int a, b;
if ((a = 10) > 5) { // a получает 10, затем проверяется условие
printf("a больше 5\n");
}
printf("a = %d\n", a); // 10
// Полезно для инициализации в условиях
while ((b = getNumber()) != 0) { // Псевдокод
printf("Обрабатываем число: %d\n", b);
}
Практические примеры
Счетчики и накопители
#include <stdio.h>
int main() {
int totalScore = 0;
int gamesPlayed = 0;
// Симуляция результатов игр
int gameResults[] = {85, 92, 78, 95, 88};
int numberOfGames = 5;
for (int i = 0; i < numberOfGames; i++) {
totalScore += gameResults[i]; // Накапливаем сумму
gamesPlayed++; // Увеличиваем счетчик
printf("Игра %d: %d очков\n", gamesPlayed, gameResults[i]);
}
float average = (float)totalScore / gamesPlayed;
printf("---------------------------\n");
printf("Всего игр: %d\n", gamesPlayed);
printf("Общий счет: %d\n", totalScore);
printf("Средний результат: %.1f\n", average);
return 0;
}
Управление флагами состояния
#include <stdio.h>
#define LOGGED_IN 1 // 001
#define HAS_PREMIUM 2 // 010
#define IS_ADMIN 4 // 100
int main() {
int userStatus = 0; // Начальное состояние
// Пользователь входит в систему
userStatus |= LOGGED_IN;
printf("Пользователь вошел в систему\n");
// Покупает премиум
userStatus |= HAS_PREMIUM;
printf("Премиум активирован\n");
// Проверяем статус
printf("\n=== СТАТУС ПОЛЬЗОВАТЕЛЯ ===\n");
printf("Авторизован: %s\n", (userStatus & LOGGED_IN) ? "Да" : "Нет");
printf("Премиум: %s\n", (userStatus & HAS_PREMIUM) ? "Да" : "Нет");
printf("Админ: %s\n", (userStatus & IS_ADMIN) ? "Да" : "Нет");
// Отзываем премиум
userStatus &= ~HAS_PREMIUM;
printf("\nПремиум отозван\n");
printf("Премиум активен: %s\n", (userStatus & HAS_PREMIUM) ? "Да" : "Нет");
return 0;
}
Часто встречающиеся ошибки
Распространенные проблемы
// ❌ Путаница = и ==
int x = 5;
if (x = 10) { // Присваивание вместо сравнения!
printf("Условие всегда истинно\n");
}
// ✅ Правильно
if (x == 10) {
// ❌ Неопределенное поведение
int i = 5;
i = i++ + ++i; // Результат непредсказуем!
// ❌ Деление на ноль в составном операторе
int x = 10;
x /= 0; // Ошибка выполнения!
Рекомендации
- Избегайте сложных выражений с множественными присваиваниями
- Используйте составные операторы для ясности:
x += 1понятнее чемx = x + 1 - Будьте осторожны с операторами
++и--в сложных выражениях - Проверяйте деление на ноль перед использованием
/=и%=
Операции присваивания — основной способ изменения данных в программах на языке Си.